home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 June: Reference Library / Dev.CD Jun 96 RL / Dev.CD Jun 96 RL.toast / What's New? / Development Kits / Apple Game Sprockets DR1 / Examples / SoundSprocketTest / TS3TestHiLevel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-24  |  49.3 KB  |  2,156 lines  |  [TEXT/MPS ]

  1. /*
  2.  *    File:        TS3TestHiLevel.c
  3.  *    Author:        Dan Venolia
  4.  *
  5.  *    Copyright © 1996 Apple Computer, Inc.
  6.  */
  7.  
  8. #include <assert.h>
  9. #include <math.h>
  10. #include <string.h>
  11.  
  12. #include <Dialogs.h>
  13. #include <Fonts.h>
  14. #include <Timer.h>
  15.  
  16. #include <QD3D.h>
  17. #include <QD3DMath.h>
  18.  
  19. #include "TS3Resource.h"
  20. #include "TS3Sound.h"
  21. #include "TS3TestHiLevel.h"
  22. #include "TS3Utils.h"
  23. #include "TS3Window.h"
  24.  
  25. #include "SoundSprocket.h"
  26.  
  27.  
  28. typedef struct TTestHiLevelData {
  29.     float            duration;
  30.     
  31.     TQ3Vector3D        listenerTranslate1;
  32.     TQ3Vector3D        listenerTranslate2;
  33.     Boolean            listenerTranslateRange;
  34.     
  35.     TQ3Vector3D        listenerRotationAxis1;
  36.     TQ3Vector3D        listenerRotationAxis2;
  37.     Boolean            listenerRotationAxisRange;
  38.     
  39.     float            listenerRotationAngle1;
  40.     float            listenerRotationAngle2;
  41.     Boolean            listenerRotationAngleRange;
  42.     
  43.     TQ3Vector3D        listenerScale1;
  44.     TQ3Vector3D        listenerScale2;
  45.     Boolean            listenerScaleRange;
  46.     
  47.     TQ3Vector3D        listenerPosition1;
  48.     TQ3Vector3D        listenerPosition2;
  49.     Boolean            listenerPositionRange;
  50.     
  51.     TQ3Vector3D        listenerOrientation1;
  52.     TQ3Vector3D        listenerOrientation2;
  53.     Boolean            listenerOrientationRange;
  54.     
  55.     TQ3Vector3D        listenerUpVector1;
  56.     TQ3Vector3D        listenerUpVector2;
  57.     Boolean            listenerUpVectorRange;
  58.     
  59.     TQ3Vector3D        listenerVelocity1;
  60.     TQ3Vector3D        listenerVelocity2;
  61.     Boolean            listenerVelocityRange;
  62.     
  63.     UInt32            medium;
  64.     
  65.     float            humidity1;
  66.     float            humidity2;
  67.     Boolean            humidityRange;
  68.     
  69.     float            roomSize1;
  70.     float            roomSize2;
  71.     Boolean            roomSizeRange;
  72.     
  73.     float            roomReflectivity1;
  74.     float            roomReflectivity2;
  75.     Boolean            roomReflectivityRange;
  76.     
  77.     float            reverbAttenuation1;
  78.     float            reverbAttenuation2;
  79.     Boolean            reverbAttenuationRange;
  80.     
  81.     UInt32            cpuLoad1;
  82.     UInt32            cpuLoad2;
  83.     Boolean            cpuLoadRange;
  84.     
  85.     TQ3Vector3D        sourceTranslate1;
  86.     TQ3Vector3D        sourceTranslate2;
  87.     Boolean            sourceTranslateRange;
  88.     
  89.     TQ3Vector3D        sourceRotationAxis1;
  90.     TQ3Vector3D        sourceRotationAxis2;
  91.     Boolean            sourceRotationAxisRange;
  92.     
  93.     float            sourceRotationAngle1;
  94.     float            sourceRotationAngle2;
  95.     Boolean            sourceRotationAngleRange;
  96.     
  97.     TQ3Vector3D        sourceScale1;
  98.     TQ3Vector3D        sourceScale2;
  99.     Boolean            sourceScaleRange;
  100.     
  101.     TQ3Vector3D        sourcePosition1;
  102.     TQ3Vector3D        sourcePosition2;
  103.     Boolean            sourcePositionRange;
  104.     
  105.     TQ3Vector3D        sourceOrientation1;
  106.     TQ3Vector3D        sourceOrientation2;
  107.     Boolean            sourceOrientationRange;
  108.     
  109.     TQ3Vector3D        sourceUpVector1;
  110.     TQ3Vector3D        sourceUpVector2;
  111.     Boolean            sourceUpVectorRange;
  112.     
  113.     TQ3Vector3D        sourceVelocity1;
  114.     TQ3Vector3D        sourceVelocity2;
  115.     Boolean            sourceVelocityRange;
  116.     
  117.     UInt32            sourceMode;
  118.     
  119.     float            referenceDistance1;
  120.     float            referenceDistance2;
  121.     Boolean            referenceDistanceRange;
  122.     
  123.     float            length1;
  124.     float            length2;
  125.     Boolean            lengthRange;
  126.     
  127.     float            width1;
  128.     float            width2;
  129.     Boolean            widthRange;
  130.     
  131.     float            height1;
  132.     float            height2;
  133.     Boolean            heightRange;
  134.     
  135.     float            coneAngleDeg1;
  136.     float            coneAngleDeg2;
  137.     Boolean            coneAngleDegRange;
  138.     
  139.     float            coneAttenuation1;
  140.     float            coneAttenuation2;
  141.     Boolean            coneAttenuationRange;
  142.     
  143.     float            coneAngleCos1;
  144.     float            coneAngleCos2;
  145. } TTestHiLevelData;
  146.  
  147.  
  148. static DialogPtr                gTestHiLevelDialog                = NULL;
  149. static UserItemUPP                gTestHiLevelProgressUserItem    = NULL;
  150. static UInt32                    gTestHiLevelCPULoadLimit;
  151. static TTestHiLevelData            gTestHiLevelData;
  152. static Boolean                    gTestHiLevelUpdate                = true;
  153. static ListenerReference        gTestHiLevelListener            = NULL;
  154. static SourceReference            gTestHiLevelSource                = NULL;
  155.  
  156. static UnsignedWide                gTestHiLevelCycleStart;
  157. static float                    gTestHiLevelInterpolant            = 0;
  158. static Boolean                    gTestHiLevelForward                = true;
  159.  
  160.  
  161. static WindowMethodPtr TestHiLevel_MetaHandler(
  162.     WindowMethod        inMethod);
  163.  
  164. static void TestHiLevel_GetSleep(
  165.     WindowPtr            inWindow,
  166.     UInt32*                outSleep);
  167.  
  168. static void TestHiLevel_ConsumeEvent(
  169.     WindowPtr            inWindow,
  170.     const EventRecord*    inEvent,
  171.     Boolean*            outConsumed);
  172.  
  173. static pascal void TestHiLevel_ProgressUserItem(
  174.     DialogPtr            inDialog,
  175.     short                inItem);
  176.  
  177. static void TestHiLevel_Interpolate(
  178.     void);
  179.  
  180. static float TestHiLevel_InterpolateFloat(
  181.     float                inWhere,
  182.     float                inVal0,
  183.     float                inVal1,
  184.     Boolean                inIsRange);
  185.  
  186. static void TestHiLevel_InterpolateVector3D(
  187.     float                inWhere,
  188.     const TQ3Vector3D*    inVal0,
  189.     const TQ3Vector3D*    inVal1,
  190.     Boolean                inIsRange,
  191.     TQ3Vector3D*        outResult);
  192.  
  193. static void TestHiLevel_DeriveData(
  194.     void);
  195.  
  196. static void TestHiLevel_SetDialogFields(
  197.     void);
  198.  
  199. static void TestHiLevel_GetDialogFields(
  200.     void);
  201.  
  202.  
  203. /* =============================================================================
  204.  *        TestHiLevel_Init (external)
  205.  *
  206.  *    Initializes our thing.
  207.  * ========================================================================== */
  208. void TestHiLevel_Init(
  209.     void)
  210. {
  211.     OSErr                err;
  212.     short                itemType;
  213.     Handle                itemHandle;
  214.     Rect                itemBounds;
  215.     Str255                str;
  216.     TQ3Vector3D            zeroVector    = {0.0, 0.0, 0.0};
  217.     TQ3Vector3D            oneVector    = {1.0, 1.0, 1.0};
  218.     TQ3Vector3D            xVector        = {1.0, 0.0, 0.0};
  219.     TQ3Vector3D            yVector        = {0.0, 1.0, 0.0};
  220.     
  221.     // Make sure we didn't mess up the dialog items
  222.     assert(kHiLevelItem_COUNT == kHiLevelItem_ExpectedCOUNT);
  223.     
  224.     // Grab the maximum CPU load limit value
  225.     gTestHiLevelCPULoadLimit = 999;
  226.     GetCPULoadLimit(&gTestHiLevelCPULoadLimit);
  227.     //• CHECK ERROR
  228.     
  229.     //• TODO: Read in gTestHiLevelData from preferences
  230.     
  231.     // Set up our listener and source
  232.     err = NewListener(&gTestHiLevelListener);
  233.     //• CHECK ERROR
  234.     assert(gTestHiLevelListener != NULL);
  235.     
  236.     err = NewSource(&gTestHiLevelSource);
  237.     //• CHECK ERROR
  238.     assert(gTestHiLevelSource != NULL);
  239.     
  240.     // Set the default test setup
  241.     gTestHiLevelData.duration                    = 2.0;
  242.     
  243.     gTestHiLevelData.listenerTranslate1            =
  244.     gTestHiLevelData.listenerTranslate2            = zeroVector;
  245.     gTestHiLevelData.listenerTranslateRange        = false;
  246.     
  247.     gTestHiLevelData.listenerRotationAxis1        =
  248.     gTestHiLevelData.listenerRotationAxis2        = xVector;
  249.     gTestHiLevelData.listenerRotationAxisRange    = false;
  250.     
  251.     gTestHiLevelData.listenerRotationAngle1        =
  252.     gTestHiLevelData.listenerRotationAngle2        = 0.0;
  253.     gTestHiLevelData.listenerRotationAngleRange    = false;
  254.     
  255.     gTestHiLevelData.listenerScale1                =
  256.     gTestHiLevelData.listenerScale2                = oneVector;
  257.     gTestHiLevelData.listenerScaleRange            = false;
  258.     
  259.     gTestHiLevelData.listenerPosition1            =
  260.     gTestHiLevelData.listenerPosition2            = zeroVector;
  261.     gTestHiLevelData.listenerPosition1.x        = -2.0;
  262.     gTestHiLevelData.listenerPositionRange        = false;
  263.     
  264.     gTestHiLevelData.listenerOrientation1        =
  265.     gTestHiLevelData.listenerOrientation2        = xVector;
  266.     gTestHiLevelData.listenerOrientationRange    = false;
  267.     
  268.     gTestHiLevelData.listenerUpVector1            =
  269.     gTestHiLevelData.listenerUpVector2            = yVector;
  270.     gTestHiLevelData.listenerUpVectorRange        = false;
  271.     
  272.     gTestHiLevelData.listenerVelocity1            =
  273.     gTestHiLevelData.listenerVelocity2            = zeroVector;
  274.     gTestHiLevelData.listenerVelocityRange        = false;
  275.     
  276.     gTestHiLevelData.medium                        = kMediumAir;
  277.     
  278.     gTestHiLevelData.humidity1                    =
  279.     gTestHiLevelData.humidity2                    = 0.0;
  280.     gTestHiLevelData.humidityRange                = false;
  281.     
  282.     gTestHiLevelData.roomSize1                    =
  283.     gTestHiLevelData.roomSize2                    = 0.0;
  284.     gTestHiLevelData.roomSizeRange                = false;
  285.     
  286.     gTestHiLevelData.roomReflectivity1            =
  287.     gTestHiLevelData.roomReflectivity2            = -10.0;
  288.     gTestHiLevelData.roomReflectivityRange        = false;
  289.     
  290.     gTestHiLevelData.reverbAttenuation1            =
  291.     gTestHiLevelData.reverbAttenuation2            = -15.0;
  292.     gTestHiLevelData.reverbAttenuationRange        = false;
  293.     
  294.     gTestHiLevelData.cpuLoad1                    =
  295.     gTestHiLevelData.cpuLoad2                    = 0;
  296.     gTestHiLevelData.cpuLoadRange                = false;
  297.     
  298.     gTestHiLevelData.sourceTranslate1            =
  299.     gTestHiLevelData.sourceTranslate2            = zeroVector;
  300.     gTestHiLevelData.sourceTranslateRange        = false;
  301.     
  302.     gTestHiLevelData.sourceRotationAxis1        =
  303.     gTestHiLevelData.sourceRotationAxis2        = xVector;
  304.     gTestHiLevelData.sourceRotationAxisRange    = false;
  305.     
  306.     gTestHiLevelData.sourceRotationAngle1        =
  307.     gTestHiLevelData.sourceRotationAngle2        = 0.0;
  308.     gTestHiLevelData.sourceRotationAngleRange    = false;
  309.     
  310.     gTestHiLevelData.sourceScale1                =
  311.     gTestHiLevelData.sourceScale2                = oneVector;
  312.     gTestHiLevelData.sourceScaleRange            = false;
  313.     
  314.     gTestHiLevelData.sourcePosition1            =
  315.     gTestHiLevelData.sourcePosition2            = zeroVector;
  316.     gTestHiLevelData.sourcePosition1.z            = -10.0;
  317.     gTestHiLevelData.sourcePosition2.z            = 10.0;
  318.     gTestHiLevelData.sourcePositionRange        = true;
  319.     
  320.     gTestHiLevelData.sourceOrientation1            =
  321.     gTestHiLevelData.sourceOrientation2            = xVector;
  322.     gTestHiLevelData.sourceOrientationRange        = false;
  323.     
  324.     gTestHiLevelData.sourceUpVector1            =
  325.     gTestHiLevelData.sourceUpVector2            = yVector;
  326.     gTestHiLevelData.sourceUpVectorRange        = false;
  327.     
  328.     gTestHiLevelData.sourceVelocity1            =
  329.     gTestHiLevelData.sourceVelocity2            = zeroVector;
  330.     gTestHiLevelData.sourceVelocityRange        = false;
  331.     
  332.     gTestHiLevelData.sourceMode                    = kSourceModeLocalized;
  333.     
  334.     gTestHiLevelData.referenceDistance1            =
  335.     gTestHiLevelData.referenceDistance2            = 1.0;
  336.     gTestHiLevelData.referenceDistanceRange        = false;
  337.     
  338.     gTestHiLevelData.length1                    =
  339.     gTestHiLevelData.length2                    = 0.0;
  340.     gTestHiLevelData.lengthRange                = false;
  341.     
  342.     gTestHiLevelData.width1                        =
  343.     gTestHiLevelData.width2                        = 0.0;
  344.     gTestHiLevelData.widthRange                    = false;
  345.     
  346.     gTestHiLevelData.height1                    =
  347.     gTestHiLevelData.height2                    = 0.0;
  348.     gTestHiLevelData.heightRange                = false;
  349.     
  350.     gTestHiLevelData.coneAngleDeg1                =
  351.     gTestHiLevelData.coneAngleDeg2                = 0.0;
  352.     gTestHiLevelData.coneAngleDegRange            = false;
  353.     
  354.     gTestHiLevelData.coneAttenuation1            =
  355.     gTestHiLevelData.coneAttenuation2            = 0.0;
  356.     gTestHiLevelData.coneAttenuationRange        = false;
  357.     
  358.     TestHiLevel_DeriveData();
  359.     
  360.     // Grab the dialog
  361.     gTestHiLevelDialog = GetNewDialog(kDlogID_HiLevel, NULL, (WindowPtr) -1);
  362.     assert(gTestHiLevelDialog != NULL);
  363.     
  364.     SetPort(gTestHiLevelDialog);
  365.     TextFont(geneva);
  366.     TextSize(10);
  367.     
  368.     // Set up our method table
  369.     Window_New(gTestHiLevelDialog, TestHiLevel_MetaHandler);
  370.     
  371.     // Do the user items
  372.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_UpdateHilite, &itemType, &itemHandle, &itemBounds);
  373.     SetDialogItem(gTestHiLevelDialog, kHiLevelItem_UpdateHilite, itemType, (Handle) Utils_GetOKUserItemProc(), &itemBounds);
  374.     
  375.     gTestHiLevelProgressUserItem = NewUserItemProc(TestHiLevel_ProgressUserItem);
  376.     assert(gTestHiLevelProgressUserItem != NULL);
  377.     
  378.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Progress, &itemType, &itemHandle, &itemBounds);
  379.     SetDialogItem(gTestHiLevelDialog, kHiLevelItem_Progress, itemType, (Handle) gTestHiLevelProgressUserItem, &itemBounds);
  380.     
  381.     // Show the quality limit
  382.     sprintf((char*) str, "x[0..%ld]", gTestHiLevelCPULoadLimit);
  383.     str[0] = strlen((char*) str)-1;
  384.     
  385.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_CPULoadUnits, &itemType, &itemHandle, &itemBounds);
  386.     SetDialogItemText(itemHandle, str);
  387.     
  388.     // Set the initial field values
  389.     TestHiLevel_SetDialogFields();
  390.     
  391.     // Select the first field
  392.     SelectDialogItemText(gTestHiLevelDialog, kHiLevelItem_Duration, 0, 32767);
  393.     
  394.     // Show the dialog
  395.     ShowWindow(gTestHiLevelDialog);
  396.     
  397.     // Initialize our cycle timer
  398.     Microseconds(&gTestHiLevelCycleStart);
  399. }
  400.  
  401.  
  402. /* =============================================================================
  403.  *        TestHiLevel_Exit (external)
  404.  *
  405.  *    Cleans up.
  406.  * ========================================================================== */
  407. void TestHiLevel_Exit(
  408.     void)
  409. {
  410.     //• TODO: Save gTestHiLevel to preferences
  411.     
  412.     if (gTestHiLevelDialog != NULL)
  413.     {
  414.         DisposeDialog(gTestHiLevelDialog);
  415.         gTestHiLevelDialog = NULL;
  416.     }
  417.     
  418.     if (gTestHiLevelProgressUserItem != NULL)
  419.     {
  420.         DisposeRoutineDescriptor(gTestHiLevelProgressUserItem);
  421.         gTestHiLevelProgressUserItem = NULL;
  422.     }
  423.     
  424.     if (gTestHiLevelListener != NULL)
  425.     {
  426.         DisposeListener(gTestHiLevelListener);
  427.         gTestHiLevelListener = NULL;
  428.     }
  429.     
  430.     if (gTestHiLevelSource != NULL)
  431.     {
  432.         DisposeSource(gTestHiLevelSource);
  433.         gTestHiLevelSource = NULL;
  434.     }
  435. }
  436.  
  437.  
  438. /* =============================================================================
  439.  *        TestHiLevel_MetaHandler (internal)
  440.  *
  441.  *    Returns the method function pointer that corresponds to the given ID.
  442.  * ========================================================================== */
  443. WindowMethodPtr TestHiLevel_MetaHandler(
  444.     WindowMethod        inMethod)
  445. {
  446.     WindowMethodPtr        result;
  447.     
  448.     result = NULL;
  449.     
  450.     switch (inMethod)
  451.     {
  452.         case kWindowMethod_GetSleep:
  453.             result = TestHiLevel_GetSleep;
  454.         break;
  455.         
  456.         case kWindowMethod_ConsumeEvent:
  457.             result = TestHiLevel_ConsumeEvent;
  458.         break;
  459.     }
  460.     
  461.     return result;
  462. }
  463.  
  464.  
  465. /* =============================================================================
  466.  *        TestHiLevel_GetSleep (internal)
  467.  *
  468.  *    Returns the sleep time to pass to WaitNextEvent when we're in front.
  469.  * ========================================================================== */
  470. void TestHiLevel_GetSleep(
  471.     WindowPtr            inWindow,
  472.     UInt32*                outSleep)
  473. {
  474.     assert(outSleep != NULL);
  475.     
  476.     *outSleep = 0;
  477. }
  478.  
  479.  
  480. /* =============================================================================
  481.  *        TestHiLevel_ConsumeEvent (internal)
  482.  *
  483.  *    Called for each event when this is the front window.
  484.  * ========================================================================== */
  485. void TestHiLevel_ConsumeEvent(
  486.     WindowPtr            inWindow,
  487.     const EventRecord*    inEvent,
  488.     Boolean*            outConsumed)
  489. {
  490.     short                itemType;
  491.     Handle                itemHandle;
  492.     Rect                itemBounds;
  493.     ControlHandle        updateButton;
  494.     Boolean                consumed;
  495.     Boolean                passToDialog;
  496.     WindowPtr            window;
  497.     short                item;
  498.     unsigned long        timeout;
  499.     UnsignedWide        now;
  500.     
  501.     assert(inEvent != NULL);
  502.     assert(outConsumed != NULL);
  503.     
  504.     consumed = false;
  505.     passToDialog = true;
  506.     
  507.     // We want to handle some events ourself
  508.     switch (inEvent->what)
  509.     {
  510.         case keyDown:
  511.         case autoKey:
  512.             passToDialog = false;
  513.             
  514.             if (inEvent->modifiers & cmdKey)
  515.             {
  516.                 if (inEvent->what != autoKey)
  517.                 {
  518.                     switch (inEvent->message & charCodeMask)
  519.                     {
  520.                         case '.':
  521.                             // anything here?
  522.                         break;
  523.                     }
  524.                 }
  525.             }
  526.             else
  527.             {
  528.                 switch (inEvent->message & charCodeMask)
  529.                 {
  530.                     case 0x08:  // backspace
  531.                     case 0x09:  // tab
  532.                     case 0x1C:  // cursor left
  533.                     case 0x1D:  // cursor right
  534.                     case 0x1E:  // cursor up
  535.                     case 0x1F:  // cursor down
  536.                     case ' ':
  537.                     case '.':
  538.                     case '-':
  539.                     case '0':
  540.                     case '1':
  541.                     case '2':
  542.                     case '3':
  543.                     case '4':
  544.                     case '5':
  545.                     case '6':
  546.                     case '7':
  547.                     case '8':
  548.                     case '9':
  549.                         // Pass it to the dialog
  550.                         passToDialog = true;
  551.                     break;
  552.                     
  553.                     case 0x03:  // enter
  554.                     case 0x0D:  // return
  555.                         if (inEvent->what != autoKey)
  556.                         {
  557.                             // Update button equivalent
  558.                             GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Update, &itemType, &itemHandle, &itemBounds);
  559.                             updateButton = (ControlHandle) itemHandle;
  560.                             
  561.                             if ((*updateButton)->contrlHilite == 0)
  562.                             {
  563.                                 HiliteControl(updateButton, 1);
  564.                                 
  565.                                 timeout = TickCount()+6;
  566.                                 while (TickCount() < timeout) /* wait */;
  567.                                 
  568.                                 HiliteControl(updateButton, 0);
  569.                                 
  570.                                 TestHiLevel_GetDialogFields();
  571.                                 
  572.                                 consumed = true;
  573.                             }
  574.                         }
  575.                     break;
  576.                     
  577.                     default:
  578.                         SysBeep(10);
  579.                         consumed = true;
  580.                 }
  581.             }
  582.         break;
  583.         
  584.         case nullEvent:
  585.             // Find where we are in the cycle (0 is start, 1 is end)
  586.             Microseconds(&now);
  587.             gTestHiLevelInterpolant = Utils_Interval(&gTestHiLevelCycleStart, &now) / gTestHiLevelData.duration;
  588.             
  589.             // Are we past the end of the cycle?
  590.             if (gTestHiLevelInterpolant > 1.0)
  591.             {
  592.                 gTestHiLevelCycleStart = now;
  593.                 gTestHiLevelForward = !gTestHiLevelForward;
  594.                 gTestHiLevelInterpolant = 0.0;
  595.             }
  596.             
  597.             // Reverse it on every other cycle
  598.             if (!gTestHiLevelForward)
  599.             {
  600.                 gTestHiLevelInterpolant = 1.0-gTestHiLevelInterpolant;
  601.             }
  602.             
  603.             TestHiLevel_Interpolate();
  604.         break;
  605.     }
  606.     
  607.     // Do dialog stuff
  608.     if (passToDialog)
  609.     {
  610.         consumed = IsDialogEvent(inEvent);
  611.         if (consumed)
  612.         {
  613.             if (DialogSelect(inEvent, &window, &item))
  614.             {
  615.                 switch (item)
  616.                 {
  617.                     case kHiLevelItem_Update:
  618.                         TestHiLevel_GetDialogFields();
  619.                     break;
  620.                 }
  621.             }
  622.         }
  623.     }
  624.     
  625.     // Return the result
  626.     *outConsumed = consumed;
  627. }
  628.  
  629.  
  630. /* =============================================================================
  631.  *        TestHiLevel_ProgressUserItem (internal)
  632.  *
  633.  *    Draws the user item used for progress bar, based on gTestHiLevelInterpolant.
  634.  * ========================================================================== */
  635. pascal void TestHiLevel_ProgressUserItem(
  636.     DialogPtr            inDialog,
  637.     short                inItem)
  638. {
  639.     short                itemType;
  640.     Handle                itemHandle;
  641.     Rect                itemBounds;
  642.     short                size;
  643.     Rect                leftWhite;
  644.     Rect                rightWhite;
  645.     Rect                indicator;
  646.     
  647.     GetDialogItem(inDialog, inItem, &itemType, &itemHandle, &itemBounds);
  648.     
  649.     FrameRect(&itemBounds);
  650.     
  651.     InsetRect(&itemBounds, 1, 1);
  652.     size = itemBounds.bottom-itemBounds.top;
  653.     
  654.     indicator = itemBounds;
  655.     indicator.left = itemBounds.left + (long) (gTestHiLevelInterpolant*(itemBounds.right-itemBounds.left-size) + 0.5);
  656.     indicator.right = indicator.left+size;
  657.     
  658.     leftWhite = itemBounds;
  659.     leftWhite.right = indicator.left;
  660.     
  661.     rightWhite = itemBounds;
  662.     rightWhite.left = indicator.right;
  663.     
  664.     FrameRect(&indicator);
  665.     
  666.     InsetRect(&indicator, 1, 1);
  667.     FillRect(&indicator, &qd.gray);
  668.     
  669.     EraseRect(&leftWhite);
  670.     EraseRect(&rightWhite);
  671. }
  672.  
  673.  
  674. /* =============================================================================
  675.  *        TestHiLevel_Interpolate (internal)
  676.  *
  677.  *    Changes the sound channel to the correct values for the point between
  678.  *    zero and one determined by gTestHiLevelInterpolant.
  679.  * ========================================================================== */
  680. void TestHiLevel_Interpolate(
  681.     void)
  682. {
  683.     OSErr                err;
  684.     TQ3Vector3D            v0;
  685.     TQ3Vector3D            v1;
  686.     TQ3Vector3D            v2;
  687.     TQ3Point3D            origin = {0.0, 0.0, 0.0};
  688.     TQ3Matrix4x4        m0;
  689.     TQ3Matrix4x4        m1;
  690.     TQ3Matrix4x4        m2;
  691.     TQ3Matrix4x4        m;
  692.     Snd3DInfo            snd3DInfo;
  693.     
  694.     if (gTestHiLevelUpdate                            ||
  695.         gTestHiLevelData.listenerTranslateRange        ||
  696.         gTestHiLevelData.listenerRotationAxisRange    ||
  697.         gTestHiLevelData.listenerRotationAngleRange    ||
  698.         gTestHiLevelData.listenerScaleRange)
  699.     {
  700.         TestHiLevel_InterpolateVector3D(
  701.                 gTestHiLevelInterpolant,
  702.                 &gTestHiLevelData.listenerTranslate1,
  703.                 &gTestHiLevelData.listenerTranslate2,
  704.                 gTestHiLevelData.listenerTranslateRange,
  705.                 &v0);
  706.         
  707.         TestHiLevel_InterpolateVector3D(
  708.                 gTestHiLevelInterpolant,
  709.                 &gTestHiLevelData.listenerRotationAxis1,
  710.                 &gTestHiLevelData.listenerRotationAxis2,
  711.                 gTestHiLevelData.listenerRotationAxisRange,
  712.                 &v1);
  713.         
  714.         TestHiLevel_InterpolateVector3D(
  715.                 gTestHiLevelInterpolant,
  716.                 &gTestHiLevelData.listenerScale1,
  717.                 &gTestHiLevelData.listenerScale2,
  718.                 gTestHiLevelData.listenerScaleRange,
  719.                 &v2);
  720.         
  721.         Q3Matrix4x4_SetTranslate(
  722.                 &m0,
  723.                 v0.x,
  724.                 v0.y,
  725.                 v0.z);
  726.         
  727.         Q3Matrix4x4_SetRotateAboutAxis(
  728.                 &m1,
  729.                 &origin,
  730.                 &v1,
  731.                 Q3Math_DegreesToRadians(TestHiLevel_InterpolateFloat(
  732.                         gTestHiLevelInterpolant,
  733.                         gTestHiLevelData.listenerRotationAngle1,
  734.                         gTestHiLevelData.listenerRotationAngle2,
  735.                         gTestHiLevelData.listenerRotationAngleRange)));
  736.         
  737.         Q3Matrix4x4_SetScale(
  738.                 &m2,
  739.                 v2.x,
  740.                 v2.y,
  741.                 v2.z);
  742.         
  743.         Q3Matrix4x4_Multiply(
  744.                 &m0,
  745.                 &m1,
  746.                 &m);
  747.         
  748.         Q3Matrix4x4_Multiply(
  749.                 &m,
  750.                 &m2,
  751.                 &m);
  752.         
  753.         err = SetListenerTransform(gTestHiLevelListener, &m);
  754.     }
  755.     
  756.     if (gTestHiLevelUpdate                            ||
  757.         gTestHiLevelData.listenerPositionRange)
  758.     {
  759.         TestHiLevel_InterpolateVector3D(
  760.                 gTestHiLevelInterpolant,
  761.                 &gTestHiLevelData.listenerPosition1,
  762.                 &gTestHiLevelData.listenerPosition2,
  763.                 gTestHiLevelData.listenerPositionRange,
  764.                 &v0);
  765.         
  766.         err = SetListenerPosition(gTestHiLevelListener, (const TQ3Point3D*) &v0);
  767.     }
  768.     
  769.     if (gTestHiLevelUpdate                            ||
  770.         gTestHiLevelData.listenerOrientationRange)
  771.     {
  772.         TestHiLevel_InterpolateVector3D(
  773.                 gTestHiLevelInterpolant,
  774.                 &gTestHiLevelData.listenerOrientation1,
  775.                 &gTestHiLevelData.listenerOrientation2,
  776.                 gTestHiLevelData.listenerOrientationRange,
  777.                 &v0);
  778.         
  779.         err = SetListenerOrientation(gTestHiLevelListener, &v0);
  780.     }
  781.     
  782.     if (gTestHiLevelUpdate                            ||
  783.         gTestHiLevelData.listenerUpVectorRange)
  784.     {
  785.         TestHiLevel_InterpolateVector3D(
  786.                 gTestHiLevelInterpolant,
  787.                 &gTestHiLevelData.listenerUpVector1,
  788.                 &gTestHiLevelData.listenerUpVector2,
  789.                 gTestHiLevelData.listenerUpVectorRange,
  790.                 &v0);
  791.         
  792.         err = SetListenerUpVector(gTestHiLevelListener, &v0);
  793.     }
  794.     
  795.     if (gTestHiLevelUpdate                            ||
  796.         gTestHiLevelData.listenerVelocityRange)
  797.     {
  798.         TestHiLevel_InterpolateVector3D(
  799.                 gTestHiLevelInterpolant,
  800.                 &gTestHiLevelData.listenerVelocity1,
  801.                 &gTestHiLevelData.listenerVelocity2,
  802.                 gTestHiLevelData.listenerVelocityRange,
  803.                 &v0);
  804.         
  805.         err = SetListenerVelocity(gTestHiLevelListener, &v0);
  806.     }
  807.     
  808.     if (gTestHiLevelUpdate                            ||
  809.         gTestHiLevelData.humidityRange)
  810.     {
  811.         err = SetListenerMedium(
  812.                 gTestHiLevelListener,
  813.                 gTestHiLevelData.medium,
  814.                 TestHiLevel_InterpolateFloat(
  815.                         gTestHiLevelInterpolant,
  816.                         gTestHiLevelData.humidity1,
  817.                         gTestHiLevelData.humidity2,
  818.                         gTestHiLevelData.humidityRange));
  819.     }
  820.     
  821.     if (gTestHiLevelUpdate                            ||
  822.         gTestHiLevelData.roomSizeRange                ||
  823.         gTestHiLevelData.roomReflectivityRange        ||
  824.         gTestHiLevelData.reverbAttenuationRange)
  825.     {
  826.         err = SetListenerReverb(
  827.                 gTestHiLevelListener,
  828.                 TestHiLevel_InterpolateFloat(
  829.                         gTestHiLevelInterpolant,
  830.                         gTestHiLevelData.roomSize1,
  831.                         gTestHiLevelData.roomSize2,
  832.                         gTestHiLevelData.roomSizeRange),
  833.                 TestHiLevel_InterpolateFloat(
  834.                         gTestHiLevelInterpolant,
  835.                         gTestHiLevelData.roomReflectivity1,
  836.                         gTestHiLevelData.roomReflectivity2,
  837.                         gTestHiLevelData.roomReflectivityRange),
  838.                 TestHiLevel_InterpolateFloat(
  839.                         gTestHiLevelInterpolant,
  840.                         gTestHiLevelData.reverbAttenuation1,
  841.                         gTestHiLevelData.reverbAttenuation2,
  842.                         gTestHiLevelData.reverbAttenuationRange));
  843.     }
  844.     
  845.     snd3DInfo.cpuLoad = (UInt32) (TestHiLevel_InterpolateFloat(
  846.             gTestHiLevelInterpolant,
  847.             (float) gTestHiLevelData.cpuLoad1,
  848.             (float) gTestHiLevelData.cpuLoad2,
  849.             gTestHiLevelData.cpuLoadRange) + 0.5);
  850.     
  851.     if (gTestHiLevelUpdate                            ||
  852.         gTestHiLevelData.cpuLoadRange)
  853.     {
  854.         err = SetListenerCPULoad(
  855.                 gTestHiLevelListener,
  856.                 (UInt32) (TestHiLevel_InterpolateFloat(
  857.                         gTestHiLevelInterpolant,
  858.                         (float) gTestHiLevelData.cpuLoad1,
  859.                         (float) gTestHiLevelData.cpuLoad2,
  860.                         gTestHiLevelData.cpuLoadRange) + 0.5));
  861.     }
  862.     
  863.     if (gTestHiLevelUpdate                            ||
  864.         gTestHiLevelData.sourceTranslateRange        ||
  865.         gTestHiLevelData.sourceRotationAxisRange    ||
  866.         gTestHiLevelData.sourceRotationAngleRange    ||
  867.         gTestHiLevelData.sourceScaleRange)
  868.     {
  869.         TestHiLevel_InterpolateVector3D(
  870.                 gTestHiLevelInterpolant,
  871.                 &gTestHiLevelData.sourceTranslate1,
  872.                 &gTestHiLevelData.sourceTranslate2,
  873.                 gTestHiLevelData.sourceTranslateRange,
  874.                 &v0);
  875.         
  876.         TestHiLevel_InterpolateVector3D(
  877.                 gTestHiLevelInterpolant,
  878.                 &gTestHiLevelData.sourceRotationAxis1,
  879.                 &gTestHiLevelData.sourceRotationAxis2,
  880.                 gTestHiLevelData.sourceRotationAxisRange,
  881.                 &v1);
  882.         
  883.         TestHiLevel_InterpolateVector3D(
  884.                 gTestHiLevelInterpolant,
  885.                 &gTestHiLevelData.sourceScale1,
  886.                 &gTestHiLevelData.sourceScale2,
  887.                 gTestHiLevelData.sourceScaleRange,
  888.                 &v2);
  889.         
  890.         Q3Matrix4x4_SetTranslate(
  891.                 &m0,
  892.                 v0.x,
  893.                 v0.y,
  894.                 v0.z);
  895.         
  896.         Q3Matrix4x4_SetRotateAboutAxis(
  897.                 &m1,
  898.                 &origin,
  899.                 &v1,
  900.                 Q3Math_DegreesToRadians(TestHiLevel_InterpolateFloat(
  901.                         gTestHiLevelInterpolant,
  902.                         gTestHiLevelData.sourceRotationAngle1,
  903.                         gTestHiLevelData.sourceRotationAngle2,
  904.                         gTestHiLevelData.sourceRotationAngleRange)));
  905.         
  906.         Q3Matrix4x4_SetScale(
  907.                 &m2,
  908.                 v2.x,
  909.                 v2.y,
  910.                 v2.z);
  911.         
  912.         Q3Matrix4x4_Multiply(
  913.                 &m0,
  914.                 &m1,
  915.                 &m);
  916.         
  917.         Q3Matrix4x4_Multiply(
  918.                 &m,
  919.                 &m2,
  920.                 &m);
  921.         
  922.         err = SetSourceTransform(gTestHiLevelSource, &m);
  923.     }
  924.     
  925.     if (gTestHiLevelUpdate                            ||
  926.         gTestHiLevelData.sourcePositionRange)
  927.     {
  928.         TestHiLevel_InterpolateVector3D(
  929.                 gTestHiLevelInterpolant,
  930.                 &gTestHiLevelData.sourcePosition1,
  931.                 &gTestHiLevelData.sourcePosition2,
  932.                 gTestHiLevelData.sourcePositionRange,
  933.                 &v0);
  934.         
  935.         err = SetSourcePosition(gTestHiLevelSource, (const TQ3Point3D*) &v0);
  936.     }
  937.     
  938.     if (gTestHiLevelUpdate                            ||
  939.         gTestHiLevelData.sourceOrientationRange)
  940.     {
  941.         TestHiLevel_InterpolateVector3D(
  942.                 gTestHiLevelInterpolant,
  943.                 &gTestHiLevelData.sourceOrientation1,
  944.                 &gTestHiLevelData.sourceOrientation2,
  945.                 gTestHiLevelData.sourceOrientationRange,
  946.                 &v0);
  947.         
  948.         err = SetSourceOrientation(gTestHiLevelSource, &v0);
  949.     }
  950.     
  951.     if (gTestHiLevelUpdate                            ||
  952.         gTestHiLevelData.sourceUpVectorRange)
  953.     {
  954.         TestHiLevel_InterpolateVector3D(
  955.                 gTestHiLevelInterpolant,
  956.                 &gTestHiLevelData.sourceUpVector1,
  957.                 &gTestHiLevelData.sourceUpVector2,
  958.                 gTestHiLevelData.sourceUpVectorRange,
  959.                 &v0);
  960.         
  961.         err = SetSourceUpVector(gTestHiLevelSource, &v0);
  962.     }
  963.     
  964.     if (gTestHiLevelUpdate                            ||
  965.         gTestHiLevelData.sourceVelocityRange)
  966.     {
  967.         TestHiLevel_InterpolateVector3D(
  968.                 gTestHiLevelInterpolant,
  969.                 &gTestHiLevelData.sourceVelocity1,
  970.                 &gTestHiLevelData.sourceVelocity2,
  971.                 gTestHiLevelData.sourceVelocityRange,
  972.                 &v0);
  973.         
  974.         err = SetSourceVelocity(gTestHiLevelSource, &v0);
  975.     }
  976.     
  977.     if (gTestHiLevelUpdate)
  978.     {
  979.         err = SetSourceMode(
  980.                 gTestHiLevelSource,
  981.                 gTestHiLevelData.sourceMode);
  982.     }
  983.     
  984.     if (gTestHiLevelUpdate                            ||
  985.         gTestHiLevelData.referenceDistanceRange)
  986.     {
  987.         err = SetSourceReferenceDistance(
  988.                 gTestHiLevelSource,
  989.                 TestHiLevel_InterpolateFloat(
  990.                         gTestHiLevelInterpolant,
  991.                         gTestHiLevelData.referenceDistance1,
  992.                         gTestHiLevelData.referenceDistance2,
  993.                         gTestHiLevelData.referenceDistanceRange));
  994.     }
  995.     
  996.     if (gTestHiLevelUpdate                            ||
  997.         gTestHiLevelData.lengthRange                ||
  998.         gTestHiLevelData.widthRange                    ||
  999.         gTestHiLevelData.heightRange)
  1000.     {
  1001.         err = SetSourceSize(
  1002.                 gTestHiLevelSource,
  1003.                 TestHiLevel_InterpolateFloat(
  1004.                         gTestHiLevelInterpolant,
  1005.                         gTestHiLevelData.length1,
  1006.                         gTestHiLevelData.length2,
  1007.                         gTestHiLevelData.lengthRange),
  1008.                 TestHiLevel_InterpolateFloat(
  1009.                         gTestHiLevelInterpolant,
  1010.                         gTestHiLevelData.width1,
  1011.                         gTestHiLevelData.width2,
  1012.                         gTestHiLevelData.widthRange),
  1013.                 TestHiLevel_InterpolateFloat(
  1014.                         gTestHiLevelInterpolant,
  1015.                         gTestHiLevelData.height1,
  1016.                         gTestHiLevelData.height2,
  1017.                         gTestHiLevelData.heightRange));
  1018.     }
  1019.     
  1020.     if (gTestHiLevelUpdate                            ||
  1021.         gTestHiLevelData.coneAngleDegRange            ||
  1022.         gTestHiLevelData.coneAttenuationRange)
  1023.     {
  1024.         err = SetSourceAngularAttenuation(
  1025.                 gTestHiLevelSource,
  1026.                 Q3Math_DegreesToRadians(TestHiLevel_InterpolateFloat(
  1027.                         gTestHiLevelInterpolant,
  1028.                         gTestHiLevelData.coneAngleDeg1,
  1029.                         gTestHiLevelData.coneAngleDeg2,
  1030.                         gTestHiLevelData.coneAngleDegRange)),
  1031.                 TestHiLevel_InterpolateFloat(
  1032.                         gTestHiLevelInterpolant,
  1033.                         gTestHiLevelData.coneAttenuation1,
  1034.                         gTestHiLevelData.coneAttenuation2,
  1035.                         gTestHiLevelData.coneAttenuationRange));
  1036.     }
  1037.     
  1038.     // Make the filter changes
  1039.     GetSource3DInfo(gTestHiLevelSource, gTestHiLevelListener, &snd3DInfo);
  1040.     Sound_Set3DInfo(&snd3DInfo);
  1041.     
  1042.     // Update the progress bar
  1043.     SetPort(gTestHiLevelDialog);
  1044.     TestHiLevel_ProgressUserItem(gTestHiLevelDialog, kHiLevelItem_Progress);
  1045.     
  1046.     // Done
  1047.     gTestHiLevelUpdate = false;
  1048. }
  1049.  
  1050.  
  1051. /* =============================================================================
  1052.  *        TestHiLevel_InterpolateFloat (internal)
  1053.  *
  1054.  *    Linear interpolation.  When inWhere is zero, inVal0 is returned.  When it
  1055.  *    is one, inVal1 is returned.  In between is linear.  If inIsRange is false
  1056.  *    then we ignore inVal1 and always return inVal0.
  1057.  * ========================================================================== */
  1058. float TestHiLevel_InterpolateFloat(
  1059.     float                inWhere,
  1060.     float                inVal0,
  1061.     float                inVal1,
  1062.     Boolean                inIsRange)
  1063. {
  1064.     float                result;
  1065.     
  1066.     if (inIsRange)
  1067.     {
  1068.         result = inWhere*(inVal1-inVal0) + inVal0;
  1069.     }
  1070.     else
  1071.     {
  1072.         result = inVal0;
  1073.     }
  1074.     
  1075.     return result;
  1076. }
  1077.  
  1078.  
  1079. /* =============================================================================
  1080.  *        TestHiLevel_InterpolateVector3D (internal)
  1081.  *
  1082.  *    Linear interpolation on vectors.
  1083.  * ========================================================================== */
  1084. static void TestHiLevel_InterpolateVector3D(
  1085.     float                inWhere,
  1086.     const TQ3Vector3D*    inVal0,
  1087.     const TQ3Vector3D*    inVal1,
  1088.     Boolean                inIsRange,
  1089.     TQ3Vector3D*        outResult)
  1090. {
  1091.     if (inIsRange)
  1092.     {
  1093.         outResult->x = TestHiLevel_InterpolateFloat(inWhere, inVal0->x, inVal1->x, true);
  1094.         outResult->y = TestHiLevel_InterpolateFloat(inWhere, inVal0->y, inVal1->y, true);
  1095.         outResult->z = TestHiLevel_InterpolateFloat(inWhere, inVal0->z, inVal1->z, true);
  1096.     }
  1097.     else
  1098.     {
  1099.         *outResult = *inVal0;
  1100.     }
  1101. }
  1102.  
  1103.  
  1104. /* =============================================================================
  1105.  *        TestHiLevel_DeriveData (internal)
  1106.  *
  1107.  *    Compute the derived fields in gTestHiLevelData.
  1108.  * ========================================================================== */
  1109. void TestHiLevel_DeriveData(
  1110.     void)
  1111. {
  1112.     gTestHiLevelData.coneAngleCos1 = cosf(0.5*(_PI/180.0)*gTestHiLevelData.coneAngleDeg1);
  1113.     gTestHiLevelData.coneAngleCos2 = cosf(0.5*(_PI/180.0)*gTestHiLevelData.coneAngleDeg2);
  1114.     
  1115.     //• FOR THE NON-RANGE VALUES, SET THEM IN THE SOURCE AND LISTENER
  1116. }
  1117.  
  1118.  
  1119. /* =============================================================================
  1120.  *        TestHiLevel_SetDialogFields (internal)
  1121.  *
  1122.  *    Changes the dialog's fields to reflect gTestHiLevelData.
  1123.  * ========================================================================== */
  1124. void TestHiLevel_SetDialogFields(
  1125.     void)
  1126. {
  1127.     short                itemType;
  1128.     Handle                itemHandle;
  1129.     Rect                itemBounds;
  1130.     short                value;
  1131.     
  1132.     Utils_SetFloatField(
  1133.             gTestHiLevelDialog,
  1134.             kHiLevelItem_Duration,
  1135.             gTestHiLevelData.duration,
  1136.             true);
  1137.     
  1138.     Utils_SetVector3DField(
  1139.             gTestHiLevelDialog,
  1140.             kHiLevelItem_ListenerTranslate1,
  1141.             &gTestHiLevelData.listenerTranslate1,
  1142.             true);
  1143.     
  1144.     Utils_SetVector3DField(
  1145.             gTestHiLevelDialog,
  1146.             kHiLevelItem_ListenerTranslate2,
  1147.             &gTestHiLevelData.listenerTranslate2,
  1148.             gTestHiLevelData.listenerTranslateRange);
  1149.     
  1150.     Utils_SetVector3DField(
  1151.             gTestHiLevelDialog,
  1152.             kHiLevelItem_ListenerRotationAxis1,
  1153.             &gTestHiLevelData.listenerRotationAxis1,
  1154.             true);
  1155.     
  1156.     Utils_SetVector3DField(
  1157.             gTestHiLevelDialog,
  1158.             kHiLevelItem_ListenerRotationAxis2,
  1159.             &gTestHiLevelData.listenerRotationAxis2,
  1160.             gTestHiLevelData.listenerRotationAxisRange);
  1161.     
  1162.     Utils_SetFloatField(
  1163.             gTestHiLevelDialog,
  1164.             kHiLevelItem_ListenerRotationAngle1,
  1165.             gTestHiLevelData.listenerRotationAngle1,
  1166.             true);
  1167.     
  1168.     Utils_SetFloatField(
  1169.             gTestHiLevelDialog,
  1170.             kHiLevelItem_ListenerRotationAngle2,
  1171.             gTestHiLevelData.listenerRotationAngle2,
  1172.             gTestHiLevelData.listenerRotationAngleRange);
  1173.     
  1174.     Utils_SetVector3DField(
  1175.             gTestHiLevelDialog,
  1176.             kHiLevelItem_ListenerScale1,
  1177.             &gTestHiLevelData.listenerScale1,
  1178.             true);
  1179.     
  1180.     Utils_SetVector3DField(
  1181.             gTestHiLevelDialog,
  1182.             kHiLevelItem_ListenerScale2,
  1183.             &gTestHiLevelData.listenerScale2,
  1184.             gTestHiLevelData.listenerScaleRange);
  1185.     
  1186.     Utils_SetVector3DField(
  1187.             gTestHiLevelDialog,
  1188.             kHiLevelItem_ListenerPosition1,
  1189.             &gTestHiLevelData.listenerPosition1,
  1190.             true);
  1191.     
  1192.     Utils_SetVector3DField(
  1193.             gTestHiLevelDialog,
  1194.             kHiLevelItem_ListenerPosition2,
  1195.             &gTestHiLevelData.listenerPosition2,
  1196.             gTestHiLevelData.listenerPositionRange);
  1197.     
  1198.     Utils_SetVector3DField(
  1199.             gTestHiLevelDialog,
  1200.             kHiLevelItem_ListenerOrientation1,
  1201.             &gTestHiLevelData.listenerOrientation1,
  1202.             true);
  1203.     
  1204.     Utils_SetVector3DField(
  1205.             gTestHiLevelDialog,
  1206.             kHiLevelItem_ListenerOrientation2,
  1207.             &gTestHiLevelData.listenerOrientation2,
  1208.             gTestHiLevelData.listenerOrientationRange);
  1209.     
  1210.     Utils_SetVector3DField(
  1211.             gTestHiLevelDialog,
  1212.             kHiLevelItem_ListenerUpVector1,
  1213.             &gTestHiLevelData.listenerUpVector1,
  1214.             true);
  1215.     
  1216.     Utils_SetVector3DField(
  1217.             gTestHiLevelDialog,
  1218.             kHiLevelItem_ListenerUpVector2,
  1219.             &gTestHiLevelData.listenerUpVector2,
  1220.             gTestHiLevelData.listenerUpVectorRange);
  1221.     
  1222.     Utils_SetVector3DField(
  1223.             gTestHiLevelDialog,
  1224.             kHiLevelItem_ListenerVelocity1,
  1225.             &gTestHiLevelData.listenerVelocity1,
  1226.             true);
  1227.     
  1228.     Utils_SetVector3DField(
  1229.             gTestHiLevelDialog,
  1230.             kHiLevelItem_ListenerVelocity2,
  1231.             &gTestHiLevelData.listenerVelocity2,
  1232.             gTestHiLevelData.listenerVelocityRange);
  1233.     
  1234.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Medium, &itemType, &itemHandle, &itemBounds);
  1235.     SetControlValue((ControlHandle) itemHandle,
  1236.             (gTestHiLevelData.medium == kMediumWater)
  1237.                     ? kMediumItem_Water
  1238.                     : kMediumItem_Air);
  1239.     
  1240.     Utils_SetFloatField(
  1241.             gTestHiLevelDialog,
  1242.             kHiLevelItem_Humidity1,
  1243.             gTestHiLevelData.humidity1,
  1244.             true);
  1245.     
  1246.     Utils_SetFloatField(
  1247.             gTestHiLevelDialog,
  1248.             kHiLevelItem_Humidity2,
  1249.             gTestHiLevelData.humidity2,
  1250.             gTestHiLevelData.humidityRange);
  1251.     
  1252.     Utils_SetFloatField(
  1253.             gTestHiLevelDialog,
  1254.             kHiLevelItem_RoomSize1,
  1255.             gTestHiLevelData.roomSize1,
  1256.             true);
  1257.     
  1258.     Utils_SetFloatField(
  1259.             gTestHiLevelDialog,
  1260.             kHiLevelItem_RoomSize2,
  1261.             gTestHiLevelData.roomSize2,
  1262.             gTestHiLevelData.roomSizeRange);
  1263.     
  1264.     Utils_SetFloatField(
  1265.             gTestHiLevelDialog,
  1266.             kHiLevelItem_RoomReflectivity1,
  1267.             gTestHiLevelData.roomReflectivity1,
  1268.             true);
  1269.     
  1270.     Utils_SetFloatField(
  1271.             gTestHiLevelDialog,
  1272.             kHiLevelItem_RoomReflectivity2,
  1273.             gTestHiLevelData.roomReflectivity2,
  1274.             gTestHiLevelData.roomReflectivityRange);
  1275.     
  1276.     Utils_SetFloatField(
  1277.             gTestHiLevelDialog,
  1278.             kHiLevelItem_ReverbAttenuation1,
  1279.             gTestHiLevelData.reverbAttenuation1,
  1280.             true);
  1281.     
  1282.     Utils_SetFloatField(
  1283.             gTestHiLevelDialog,
  1284.             kHiLevelItem_ReverbAttenuation2,
  1285.             gTestHiLevelData.reverbAttenuation2,
  1286.             gTestHiLevelData.reverbAttenuationRange);
  1287.     
  1288.     Utils_SetUInt32Field(
  1289.             gTestHiLevelDialog,
  1290.             kHiLevelItem_CPULoad1,
  1291.             gTestHiLevelData.cpuLoad1,
  1292.             true);
  1293.     
  1294.     Utils_SetUInt32Field(
  1295.             gTestHiLevelDialog,
  1296.             kHiLevelItem_CPULoad2,
  1297.             gTestHiLevelData.cpuLoad2,
  1298.             gTestHiLevelData.cpuLoadRange);
  1299.     
  1300.     Utils_SetVector3DField(
  1301.             gTestHiLevelDialog,
  1302.             kHiLevelItem_SourceTranslate1,
  1303.             &gTestHiLevelData.sourceTranslate1,
  1304.             true);
  1305.     
  1306.     Utils_SetVector3DField(
  1307.             gTestHiLevelDialog,
  1308.             kHiLevelItem_SourceTranslate2,
  1309.             &gTestHiLevelData.sourceTranslate2,
  1310.             gTestHiLevelData.sourceTranslateRange);
  1311.     
  1312.     Utils_SetVector3DField(
  1313.             gTestHiLevelDialog,
  1314.             kHiLevelItem_SourceRotationAxis1,
  1315.             &gTestHiLevelData.sourceRotationAxis1,
  1316.             true);
  1317.     
  1318.     Utils_SetVector3DField(
  1319.             gTestHiLevelDialog,
  1320.             kHiLevelItem_SourceRotationAxis2,
  1321.             &gTestHiLevelData.sourceRotationAxis2,
  1322.             gTestHiLevelData.sourceRotationAxisRange);
  1323.     
  1324.     Utils_SetFloatField(
  1325.             gTestHiLevelDialog,
  1326.             kHiLevelItem_SourceRotationAngle1,
  1327.             gTestHiLevelData.sourceRotationAngle1,
  1328.             true);
  1329.     
  1330.     Utils_SetFloatField(
  1331.             gTestHiLevelDialog,
  1332.             kHiLevelItem_SourceRotationAngle2,
  1333.             gTestHiLevelData.sourceRotationAngle2,
  1334.             gTestHiLevelData.sourceRotationAngleRange);
  1335.     
  1336.     Utils_SetVector3DField(
  1337.             gTestHiLevelDialog,
  1338.             kHiLevelItem_SourceScale1,
  1339.             &gTestHiLevelData.sourceScale1,
  1340.             true);
  1341.     
  1342.     Utils_SetVector3DField(
  1343.             gTestHiLevelDialog,
  1344.             kHiLevelItem_SourceScale2,
  1345.             &gTestHiLevelData.sourceScale2,
  1346.             gTestHiLevelData.sourceScaleRange);
  1347.     
  1348.     Utils_SetVector3DField(
  1349.             gTestHiLevelDialog,
  1350.             kHiLevelItem_SourcePosition1,
  1351.             &gTestHiLevelData.sourcePosition1,
  1352.             true);
  1353.     
  1354.     Utils_SetVector3DField(
  1355.             gTestHiLevelDialog,
  1356.             kHiLevelItem_SourcePosition2,
  1357.             &gTestHiLevelData.sourcePosition2,
  1358.             gTestHiLevelData.sourcePositionRange);
  1359.     
  1360.     Utils_SetVector3DField(
  1361.             gTestHiLevelDialog,
  1362.             kHiLevelItem_SourceOrientation1,
  1363.             &gTestHiLevelData.sourceOrientation1,
  1364.             true);
  1365.     
  1366.     Utils_SetVector3DField(
  1367.             gTestHiLevelDialog,
  1368.             kHiLevelItem_SourceOrientation2,
  1369.             &gTestHiLevelData.sourceOrientation2,
  1370.             gTestHiLevelData.sourceOrientationRange);
  1371.     
  1372.     Utils_SetVector3DField(
  1373.             gTestHiLevelDialog,
  1374.             kHiLevelItem_SourceUpVector1,
  1375.             &gTestHiLevelData.sourceUpVector1,
  1376.             true);
  1377.     
  1378.     Utils_SetVector3DField(
  1379.             gTestHiLevelDialog,
  1380.             kHiLevelItem_SourceUpVector2,
  1381.             &gTestHiLevelData.sourceUpVector2,
  1382.             gTestHiLevelData.sourceUpVectorRange);
  1383.     
  1384.     Utils_SetVector3DField(
  1385.             gTestHiLevelDialog,
  1386.             kHiLevelItem_SourceVelocity1,
  1387.             &gTestHiLevelData.sourceVelocity1,
  1388.             true);
  1389.     
  1390.     Utils_SetVector3DField(
  1391.             gTestHiLevelDialog,
  1392.             kHiLevelItem_SourceVelocity2,
  1393.             &gTestHiLevelData.sourceVelocity2,
  1394.             gTestHiLevelData.sourceVelocityRange);
  1395.     
  1396.     value = kSourceModeItem_Localized;
  1397.     switch (gTestHiLevelData.sourceMode)
  1398.     {
  1399.         case kSourceModeAmbient:
  1400.             value = kSourceModeItem_Ambient;
  1401.         break;
  1402.         
  1403.         case kSourceModeBinaural:
  1404.             value = kSourceModeItem_Binaural;
  1405.         break;
  1406.     }
  1407.     
  1408.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_SourceMode, &itemType, &itemHandle, &itemBounds);
  1409.     SetControlValue((ControlHandle) itemHandle, value);
  1410.     
  1411.     Utils_SetFloatField(
  1412.             gTestHiLevelDialog,
  1413.             kHiLevelItem_ReferenceDistance1,
  1414.             gTestHiLevelData.referenceDistance1,
  1415.             true);
  1416.     
  1417.     Utils_SetFloatField(
  1418.             gTestHiLevelDialog,
  1419.             kHiLevelItem_ReferenceDistance2,
  1420.             gTestHiLevelData.referenceDistance2,
  1421.             gTestHiLevelData.referenceDistanceRange);
  1422.     
  1423.     Utils_SetFloatField(
  1424.             gTestHiLevelDialog,
  1425.             kHiLevelItem_Length1,
  1426.             gTestHiLevelData.length1,
  1427.             true);
  1428.     
  1429.     Utils_SetFloatField(
  1430.             gTestHiLevelDialog,
  1431.             kHiLevelItem_Length2,
  1432.             gTestHiLevelData.length2,
  1433.             gTestHiLevelData.lengthRange);
  1434.     
  1435.     Utils_SetFloatField(
  1436.             gTestHiLevelDialog,
  1437.             kHiLevelItem_Width1,
  1438.             gTestHiLevelData.width1,
  1439.             true);
  1440.     
  1441.     Utils_SetFloatField(
  1442.             gTestHiLevelDialog,
  1443.             kHiLevelItem_Width2,
  1444.             gTestHiLevelData.width2,
  1445.             gTestHiLevelData.widthRange);
  1446.     
  1447.     Utils_SetFloatField(
  1448.             gTestHiLevelDialog,
  1449.             kHiLevelItem_Height1,
  1450.             gTestHiLevelData.height1,
  1451.             true);
  1452.     
  1453.     Utils_SetFloatField(
  1454.             gTestHiLevelDialog,
  1455.             kHiLevelItem_Height2,
  1456.             gTestHiLevelData.height2,
  1457.             gTestHiLevelData.heightRange);
  1458.     
  1459.     Utils_SetFloatField(
  1460.             gTestHiLevelDialog,
  1461.             kHiLevelItem_ConeAngleDeg1,
  1462.             gTestHiLevelData.coneAngleDeg1,
  1463.             true);
  1464.     
  1465.     Utils_SetFloatField(
  1466.             gTestHiLevelDialog,
  1467.             kHiLevelItem_ConeAngleDeg2,
  1468.             gTestHiLevelData.coneAngleDeg2,
  1469.             gTestHiLevelData.coneAngleDegRange);
  1470.     
  1471.     Utils_SetFloatField(
  1472.             gTestHiLevelDialog,
  1473.             kHiLevelItem_ConeAttenuation1,
  1474.             gTestHiLevelData.coneAttenuation1,
  1475.             true);
  1476.     
  1477.     Utils_SetFloatField(
  1478.             gTestHiLevelDialog,
  1479.             kHiLevelItem_ConeAttenuation2,
  1480.             gTestHiLevelData.coneAttenuation2,
  1481.             gTestHiLevelData.coneAttenuationRange);
  1482. }
  1483.  
  1484.  
  1485. /* =============================================================================
  1486.  *        TestHiLevel_GetDialogFields (internal)
  1487.  *
  1488.  *    Grabs the contents of the dialog fields and puts them into gTestHiLevelData.
  1489.  * ========================================================================== */
  1490. void TestHiLevel_GetDialogFields(
  1491.     void)
  1492. {
  1493.     const float            small = 0.000001;
  1494.     const float            big = 10000000.0;
  1495.     short                itemType;
  1496.     Handle                itemHandle;
  1497.     Rect                itemBounds;
  1498.     TTestHiLevelData    data;
  1499.     short                badItem;
  1500.     
  1501.     if (!Utils_GetFloatField(
  1502.             gTestHiLevelDialog,
  1503.             kHiLevelItem_Duration,
  1504.             &data.duration,
  1505.             NULL,
  1506.             small,
  1507.             big))
  1508.     {
  1509.         badItem = kHiLevelItem_Duration;
  1510.         goto bail;
  1511.     }
  1512.     
  1513.     if (!Utils_GetVector3DField(
  1514.             gTestHiLevelDialog,
  1515.             kHiLevelItem_ListenerTranslate1,
  1516.             &data.listenerTranslate1,
  1517.             NULL))
  1518.     {
  1519.         badItem = kHiLevelItem_ListenerTranslate1;
  1520.         goto bail;
  1521.     }
  1522.     
  1523.     if (!Utils_GetVector3DField(
  1524.             gTestHiLevelDialog,
  1525.             kHiLevelItem_ListenerTranslate2,
  1526.             &data.listenerTranslate2,
  1527.             &data.listenerTranslateRange))
  1528.     {
  1529.         badItem = kHiLevelItem_ListenerTranslate2;
  1530.         goto bail;
  1531.     }
  1532.     
  1533.     if (!Utils_GetVector3DField(
  1534.             gTestHiLevelDialog,
  1535.             kHiLevelItem_ListenerRotationAxis1,
  1536.             &data.listenerRotationAxis1,
  1537.             NULL))
  1538.     {
  1539.         badItem = kHiLevelItem_ListenerRotationAxis1;
  1540.         goto bail;
  1541.     }
  1542.     
  1543.     if (!Utils_GetVector3DField(
  1544.             gTestHiLevelDialog,
  1545.             kHiLevelItem_ListenerRotationAxis2,
  1546.             &data.listenerRotationAxis2,
  1547.             &data.listenerRotationAxisRange))
  1548.     {
  1549.         badItem = kHiLevelItem_ListenerRotationAxis2;
  1550.         goto bail;
  1551.     }
  1552.     
  1553.     if (!Utils_GetFloatField(
  1554.             gTestHiLevelDialog,
  1555.             kHiLevelItem_ListenerRotationAngle1,
  1556.             &data.listenerRotationAngle1,
  1557.             NULL,
  1558.             -big,
  1559.             big))
  1560.     {
  1561.         badItem = kHiLevelItem_ListenerRotationAngle1;
  1562.         goto bail;
  1563.     }
  1564.     
  1565.     if (!Utils_GetFloatField(
  1566.             gTestHiLevelDialog,
  1567.             kHiLevelItem_ListenerRotationAngle2,
  1568.             &data.listenerRotationAngle2,
  1569.             &data.listenerRotationAngleRange,
  1570.             -big,
  1571.             big))
  1572.     {
  1573.         badItem = kHiLevelItem_ListenerRotationAngle2;
  1574.         goto bail;
  1575.     }
  1576.     
  1577.     if (!Utils_GetVector3DField(
  1578.             gTestHiLevelDialog,
  1579.             kHiLevelItem_ListenerScale1,
  1580.             &data.listenerScale1,
  1581.             NULL))
  1582.     {
  1583.         badItem = kHiLevelItem_ListenerScale1;
  1584.         goto bail;
  1585.     }
  1586.     
  1587.     if (!Utils_GetVector3DField(
  1588.             gTestHiLevelDialog,
  1589.             kHiLevelItem_ListenerScale2,
  1590.             &data.listenerScale2,
  1591.             &data.listenerScaleRange))
  1592.     {
  1593.         badItem = kHiLevelItem_ListenerScale2;
  1594.         goto bail;
  1595.     }
  1596.     
  1597.     if (!Utils_GetVector3DField(
  1598.             gTestHiLevelDialog,
  1599.             kHiLevelItem_ListenerPosition1,
  1600.             &data.listenerPosition1,
  1601.             NULL))
  1602.     {
  1603.         badItem = kHiLevelItem_ListenerPosition1;
  1604.         goto bail;
  1605.     }
  1606.     
  1607.     if (!Utils_GetVector3DField(
  1608.             gTestHiLevelDialog,
  1609.             kHiLevelItem_ListenerPosition2,
  1610.             &data.listenerPosition2,
  1611.             &data.listenerPositionRange))
  1612.     {
  1613.         badItem = kHiLevelItem_ListenerPosition2;
  1614.         goto bail;
  1615.     }
  1616.     
  1617.     if (!Utils_GetVector3DField(
  1618.             gTestHiLevelDialog,
  1619.             kHiLevelItem_ListenerOrientation1,
  1620.             &data.listenerOrientation1,
  1621.             NULL))
  1622.     {
  1623.         badItem = kHiLevelItem_ListenerOrientation1;
  1624.         goto bail;
  1625.     }
  1626.     
  1627.     if (!Utils_GetVector3DField(
  1628.             gTestHiLevelDialog,
  1629.             kHiLevelItem_ListenerOrientation2,
  1630.             &data.listenerOrientation2,
  1631.             &data.listenerOrientationRange))
  1632.     {
  1633.         badItem = kHiLevelItem_ListenerOrientation2;
  1634.         goto bail;
  1635.     }
  1636.     
  1637.     if (!Utils_GetVector3DField(
  1638.             gTestHiLevelDialog,
  1639.             kHiLevelItem_ListenerUpVector1,
  1640.             &data.listenerUpVector1,
  1641.             NULL))
  1642.     {
  1643.         badItem = kHiLevelItem_ListenerUpVector1;
  1644.         goto bail;
  1645.     }
  1646.     
  1647.     if (!Utils_GetVector3DField(
  1648.             gTestHiLevelDialog,
  1649.             kHiLevelItem_ListenerUpVector2,
  1650.             &data.listenerUpVector2,
  1651.             &data.listenerUpVectorRange))
  1652.     {
  1653.         badItem = kHiLevelItem_ListenerUpVector2;
  1654.         goto bail;
  1655.     }
  1656.     
  1657.     if (!Utils_GetVector3DField(
  1658.             gTestHiLevelDialog,
  1659.             kHiLevelItem_ListenerVelocity1,
  1660.             &data.listenerVelocity1,
  1661.             NULL))
  1662.     {
  1663.         badItem = kHiLevelItem_ListenerVelocity1;
  1664.         goto bail;
  1665.     }
  1666.     
  1667.     if (!Utils_GetVector3DField(
  1668.             gTestHiLevelDialog,
  1669.             kHiLevelItem_ListenerVelocity2,
  1670.             &data.listenerVelocity2,
  1671.             &data.listenerVelocityRange))
  1672.     {
  1673.         badItem = kHiLevelItem_ListenerVelocity2;
  1674.         goto bail;
  1675.     }
  1676.     
  1677.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Medium, &itemType, &itemHandle, &itemBounds);
  1678.     switch (GetControlValue((ControlHandle) itemHandle))
  1679.     {
  1680.         case kMediumItem_Air:
  1681.             data.medium = kMediumAir;
  1682.         break;
  1683.         
  1684.         case kMediumItem_Water:
  1685.             data.medium = kMediumWater;
  1686.         break;
  1687.         
  1688.         default:
  1689.             assert(0);
  1690.     }
  1691.     
  1692.     if (!Utils_GetFloatField(
  1693.             gTestHiLevelDialog,
  1694.             kHiLevelItem_Humidity1,
  1695.             &data.humidity1,
  1696.             NULL,
  1697.             0.0,
  1698.             100.0))
  1699.     {
  1700.         badItem = kHiLevelItem_Humidity1;
  1701.         goto bail;
  1702.     }
  1703.     
  1704.     if (!Utils_GetFloatField(
  1705.             gTestHiLevelDialog,
  1706.             kHiLevelItem_Humidity2,
  1707.             &data.humidity2,
  1708.             &data.humidityRange,
  1709.             0.0,
  1710.             100.0))
  1711.     {
  1712.         badItem = kHiLevelItem_Humidity2;
  1713.         goto bail;
  1714.     }
  1715.     
  1716.     if (!Utils_GetFloatField(
  1717.             gTestHiLevelDialog,
  1718.             kHiLevelItem_RoomSize1,
  1719.             &data.roomSize1,
  1720.             NULL,
  1721.             0.0,
  1722.             big))
  1723.     {
  1724.         badItem = kHiLevelItem_RoomSize1;
  1725.         goto bail;
  1726.     }
  1727.     
  1728.     if (!Utils_GetFloatField(
  1729.             gTestHiLevelDialog,
  1730.             kHiLevelItem_RoomSize2,
  1731.             &data.roomSize2,
  1732.             &data.roomSizeRange,
  1733.             0.0,
  1734.             big))
  1735.     {
  1736.         badItem = kHiLevelItem_RoomSize2;
  1737.         goto bail;
  1738.     }
  1739.     
  1740.     if (!Utils_GetFloatField(
  1741.             gTestHiLevelDialog,
  1742.             kHiLevelItem_RoomReflectivity1,
  1743.             &data.roomReflectivity1,
  1744.             NULL,
  1745.             -big,
  1746.             -small))
  1747.     {
  1748.         badItem = kHiLevelItem_RoomReflectivity1;
  1749.         goto bail;
  1750.     }
  1751.     
  1752.     if (!Utils_GetFloatField(
  1753.             gTestHiLevelDialog,
  1754.             kHiLevelItem_RoomReflectivity2,
  1755.             &data.roomReflectivity2,
  1756.             &data.roomReflectivityRange,
  1757.             -big,
  1758.             -small))
  1759.     {
  1760.         badItem = kHiLevelItem_RoomReflectivity2;
  1761.         goto bail;
  1762.     }
  1763.     
  1764.     if (!Utils_GetFloatField(
  1765.             gTestHiLevelDialog,
  1766.             kHiLevelItem_ReverbAttenuation1,
  1767.             &data.reverbAttenuation1,
  1768.             NULL,
  1769.             -big,
  1770.             big))
  1771.     {
  1772.         badItem = kHiLevelItem_ReverbAttenuation1;
  1773.         goto bail;
  1774.     }
  1775.     
  1776.     if (!Utils_GetFloatField(
  1777.             gTestHiLevelDialog,
  1778.             kHiLevelItem_ReverbAttenuation2,
  1779.             &data.reverbAttenuation2,
  1780.             &data.reverbAttenuationRange,
  1781.             -big,
  1782.             big))
  1783.     {
  1784.         badItem = kHiLevelItem_ReverbAttenuation2;
  1785.         goto bail;
  1786.     }
  1787.     
  1788.     if (!Utils_GetUInt32Field(
  1789.             gTestHiLevelDialog,
  1790.             kHiLevelItem_CPULoad1,
  1791.             &data.cpuLoad1,
  1792.             NULL,
  1793.             0,
  1794.             gTestHiLevelCPULoadLimit))
  1795.     {
  1796.         badItem = kHiLevelItem_CPULoad1;
  1797.         goto bail;
  1798.     }
  1799.     
  1800.     if (!Utils_GetUInt32Field(
  1801.             gTestHiLevelDialog,
  1802.             kHiLevelItem_CPULoad2,
  1803.             &data.cpuLoad2,
  1804.             &data.cpuLoadRange,
  1805.             0,
  1806.             gTestHiLevelCPULoadLimit))
  1807.     {
  1808.         badItem = kHiLevelItem_CPULoad2;
  1809.         goto bail;
  1810.     }
  1811.     
  1812.     if (!Utils_GetVector3DField(
  1813.             gTestHiLevelDialog,
  1814.             kHiLevelItem_SourceTranslate1,
  1815.             &data.sourceTranslate1,
  1816.             NULL))
  1817.     {
  1818.         badItem = kHiLevelItem_SourceTranslate1;
  1819.         goto bail;
  1820.     }
  1821.     
  1822.     if (!Utils_GetVector3DField(
  1823.             gTestHiLevelDialog,
  1824.             kHiLevelItem_SourceTranslate2,
  1825.             &data.sourceTranslate2,
  1826.             &data.sourceTranslateRange))
  1827.     {
  1828.         badItem = kHiLevelItem_SourceTranslate2;
  1829.         goto bail;
  1830.     }
  1831.     
  1832.     if (!Utils_GetVector3DField(
  1833.             gTestHiLevelDialog,
  1834.             kHiLevelItem_SourceRotationAxis1,
  1835.             &data.sourceRotationAxis1,
  1836.             NULL))
  1837.     {
  1838.         badItem = kHiLevelItem_SourceRotationAxis1;
  1839.         goto bail;
  1840.     }
  1841.     
  1842.     if (!Utils_GetVector3DField(
  1843.             gTestHiLevelDialog,
  1844.             kHiLevelItem_SourceRotationAxis2,
  1845.             &data.sourceRotationAxis2,
  1846.             &data.sourceRotationAxisRange))
  1847.     {
  1848.         badItem = kHiLevelItem_SourceRotationAxis2;
  1849.         goto bail;
  1850.     }
  1851.     
  1852.     if (!Utils_GetFloatField(
  1853.             gTestHiLevelDialog,
  1854.             kHiLevelItem_SourceRotationAngle1,
  1855.             &data.sourceRotationAngle1,
  1856.             NULL,
  1857.             -big,
  1858.             big))
  1859.     {
  1860.         badItem = kHiLevelItem_SourceRotationAngle1;
  1861.         goto bail;
  1862.     }
  1863.     
  1864.     if (!Utils_GetFloatField(
  1865.             gTestHiLevelDialog,
  1866.             kHiLevelItem_SourceRotationAngle2,
  1867.             &data.sourceRotationAngle2,
  1868.             &data.sourceRotationAngleRange,
  1869.             -big,
  1870.             big))
  1871.     {
  1872.         badItem = kHiLevelItem_SourceRotationAngle2;
  1873.         goto bail;
  1874.     }
  1875.     
  1876.     if (!Utils_GetVector3DField(
  1877.             gTestHiLevelDialog,
  1878.             kHiLevelItem_SourceScale1,
  1879.             &data.sourceScale1,
  1880.             NULL))
  1881.     {
  1882.         badItem = kHiLevelItem_SourceScale1;
  1883.         goto bail;
  1884.     }
  1885.     
  1886.     if (!Utils_GetVector3DField(
  1887.             gTestHiLevelDialog,
  1888.             kHiLevelItem_SourceScale2,
  1889.             &data.sourceScale2,
  1890.             &data.sourceScaleRange))
  1891.     {
  1892.         badItem = kHiLevelItem_SourceScale2;
  1893.         goto bail;
  1894.     }
  1895.     
  1896.     if (!Utils_GetVector3DField(
  1897.             gTestHiLevelDialog,
  1898.             kHiLevelItem_SourcePosition1,
  1899.             &data.sourcePosition1,
  1900.             NULL))
  1901.     {
  1902.         badItem = kHiLevelItem_SourcePosition1;
  1903.         goto bail;
  1904.     }
  1905.     
  1906.     if (!Utils_GetVector3DField(
  1907.             gTestHiLevelDialog,
  1908.             kHiLevelItem_SourcePosition2,
  1909.             &data.sourcePosition2,
  1910.             &data.sourcePositionRange))
  1911.     {
  1912.         badItem = kHiLevelItem_SourcePosition2;
  1913.         goto bail;
  1914.     }
  1915.     
  1916.     if (!Utils_GetVector3DField(
  1917.             gTestHiLevelDialog,
  1918.             kHiLevelItem_SourceOrientation1,
  1919.             &data.sourceOrientation1,
  1920.             NULL))
  1921.     {
  1922.         badItem = kHiLevelItem_SourceOrientation1;
  1923.         goto bail;
  1924.     }
  1925.     
  1926.     if (!Utils_GetVector3DField(
  1927.             gTestHiLevelDialog,
  1928.             kHiLevelItem_SourceOrientation2,
  1929.             &data.sourceOrientation2,
  1930.             &data.sourceOrientationRange))
  1931.     {
  1932.         badItem = kHiLevelItem_SourceOrientation2;
  1933.         goto bail;
  1934.     }
  1935.     
  1936.     if (!Utils_GetVector3DField(
  1937.             gTestHiLevelDialog,
  1938.             kHiLevelItem_SourceUpVector1,
  1939.             &data.sourceUpVector1,
  1940.             NULL))
  1941.     {
  1942.         badItem = kHiLevelItem_SourceUpVector1;
  1943.         goto bail;
  1944.     }
  1945.     
  1946.     if (!Utils_GetVector3DField(
  1947.             gTestHiLevelDialog,
  1948.             kHiLevelItem_SourceUpVector2,
  1949.             &data.sourceUpVector2,
  1950.             &data.sourceUpVectorRange))
  1951.     {
  1952.         badItem = kHiLevelItem_SourceUpVector2;
  1953.         goto bail;
  1954.     }
  1955.     
  1956.     if (!Utils_GetVector3DField(
  1957.             gTestHiLevelDialog,
  1958.             kHiLevelItem_SourceVelocity1,
  1959.             &data.sourceVelocity1,
  1960.             NULL))
  1961.     {
  1962.         badItem = kHiLevelItem_SourceVelocity1;
  1963.         goto bail;
  1964.     }
  1965.     
  1966.     if (!Utils_GetVector3DField(
  1967.             gTestHiLevelDialog,
  1968.             kHiLevelItem_SourceVelocity2,
  1969.             &data.sourceVelocity2,
  1970.             &data.sourceVelocityRange))
  1971.     {
  1972.         badItem = kHiLevelItem_SourceVelocity2;
  1973.         goto bail;
  1974.     }
  1975.     
  1976.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_SourceMode, &itemType, &itemHandle, &itemBounds);
  1977.     switch (GetControlValue((ControlHandle) itemHandle))
  1978.     {
  1979.         case kSourceModeItem_Localized:
  1980.             data.sourceMode = kSourceModeLocalized;
  1981.         break;
  1982.         
  1983.         case kSourceModeItem_Ambient:
  1984.             data.sourceMode = kSourceModeAmbient;
  1985.         break;
  1986.         
  1987.         case kSourceModeItem_Binaural:
  1988.             data.sourceMode = kSourceModeBinaural;
  1989.         break;
  1990.         
  1991.         default:
  1992.             assert(0);
  1993.     }
  1994.     
  1995.     if (!Utils_GetFloatField(
  1996.             gTestHiLevelDialog,
  1997.             kHiLevelItem_ReferenceDistance1,
  1998.             &data.referenceDistance1,
  1999.             NULL,
  2000.             small,
  2001.             big))
  2002.     {
  2003.         badItem = kHiLevelItem_ReferenceDistance1;
  2004.         goto bail;
  2005.     }
  2006.     
  2007.     if (!Utils_GetFloatField(
  2008.             gTestHiLevelDialog,
  2009.             kHiLevelItem_ReferenceDistance2,
  2010.             &data.referenceDistance2,
  2011.             &data.referenceDistanceRange,
  2012.             small,
  2013.             big))
  2014.     {
  2015.         badItem = kHiLevelItem_ReferenceDistance2;
  2016.         goto bail;
  2017.     }
  2018.     
  2019.     if (!Utils_GetFloatField(
  2020.             gTestHiLevelDialog,
  2021.             kHiLevelItem_Length1,
  2022.             &data.length1,
  2023.             NULL,
  2024.             -big,
  2025.             0.0))
  2026.     {
  2027.         badItem = kHiLevelItem_Length1;
  2028.         goto bail;
  2029.     }
  2030.     
  2031.     if (!Utils_GetFloatField(
  2032.             gTestHiLevelDialog,
  2033.             kHiLevelItem_Length2,
  2034.             &data.length2,
  2035.             &data.lengthRange,
  2036.             0.0,
  2037.             big))
  2038.     {
  2039.         badItem = kHiLevelItem_Length2;
  2040.         goto bail;
  2041.     }
  2042.     
  2043.     if (!Utils_GetFloatField(
  2044.             gTestHiLevelDialog,
  2045.             kHiLevelItem_Width1,
  2046.             &data.width1,
  2047.             NULL,
  2048.             0.0,
  2049.             big))
  2050.     {
  2051.         badItem = kHiLevelItem_Width1;
  2052.         goto bail;
  2053.     }
  2054.     
  2055.     if (!Utils_GetFloatField(
  2056.             gTestHiLevelDialog,
  2057.             kHiLevelItem_Width2,
  2058.             &data.width2,
  2059.             &data.widthRange,
  2060.             0.0,
  2061.             big))
  2062.     {
  2063.         badItem = kHiLevelItem_Width2;
  2064.         goto bail;
  2065.     }
  2066.     
  2067.     if (!Utils_GetFloatField(
  2068.             gTestHiLevelDialog,
  2069.             kHiLevelItem_Height1,
  2070.             &data.height1,
  2071.             NULL,
  2072.             0.0,
  2073.             big))
  2074.     {
  2075.         badItem = kHiLevelItem_Height1;
  2076.         goto bail;
  2077.     }
  2078.     
  2079.     if (!Utils_GetFloatField(
  2080.             gTestHiLevelDialog,
  2081.             kHiLevelItem_Height2,
  2082.             &data.height2,
  2083.             &data.heightRange,
  2084.             0.0,
  2085.             big))
  2086.     {
  2087.         badItem = kHiLevelItem_Height2;
  2088.         goto bail;
  2089.     }
  2090.     
  2091.     if (!Utils_GetFloatField(
  2092.             gTestHiLevelDialog,
  2093.             kHiLevelItem_ConeAngleDeg1,
  2094.             &data.coneAngleDeg1,
  2095.             NULL,
  2096.             0.0,
  2097.             360.0))
  2098.     {
  2099.         badItem = kHiLevelItem_ConeAngleDeg1;
  2100.         goto bail;
  2101.     }
  2102.     
  2103.     if (!Utils_GetFloatField(
  2104.             gTestHiLevelDialog,
  2105.             kHiLevelItem_ConeAngleDeg2,
  2106.             &data.coneAngleDeg2,
  2107.             &data.coneAngleDegRange,
  2108.             0.0,
  2109.             360.0))
  2110.     {
  2111.         badItem = kHiLevelItem_ConeAngleDeg2;
  2112.         goto bail;
  2113.     }
  2114.     
  2115.     if (!Utils_GetFloatField(
  2116.             gTestHiLevelDialog,
  2117.             kHiLevelItem_ConeAttenuation1,
  2118.             &data.coneAttenuation1,
  2119.             NULL,
  2120.             -big,
  2121.             0.0))
  2122.     {
  2123.         badItem = kHiLevelItem_ConeAttenuation1;
  2124.         goto bail;
  2125.     }
  2126.     
  2127.     if (!Utils_GetFloatField(
  2128.             gTestHiLevelDialog,
  2129.             kHiLevelItem_ConeAttenuation2,
  2130.             &data.coneAttenuation2,
  2131.             &data.coneAttenuationRange,
  2132.             -big,
  2133.             0.0))
  2134.     {
  2135.         badItem = kHiLevelItem_ConeAttenuation2;
  2136.         goto bail;
  2137.     }
  2138.     
  2139.     // All fields are good -- finish up
  2140.     gTestHiLevelData = data;
  2141.     TestHiLevel_DeriveData();
  2142.     
  2143.     TestHiLevel_SetDialogFields();
  2144.     
  2145.     gTestHiLevelUpdate = true;
  2146.     
  2147.     return;
  2148.     
  2149.     // Error exit
  2150. bail:
  2151.     SelectDialogItemText(gTestHiLevelDialog, badItem, 0, 32767);
  2152.     StopAlert(kAlrtID_BadField, NULL);
  2153. }
  2154.  
  2155.  
  2156.